/**
* Copyright 2012 Bo Zhou <B.Zhou@ljmu.ac.uk>
* Liverpool John Moores University <http://www.ljmu.ac.uk/cmp/>
* Aniketos Project <http://www.aniketos.eu>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
package eu.aniketos.scpm.userinterface.views;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.List;
import java.util.Random;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
//import org.apache.commons.codec.binary.Base64;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Slider;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ViewPart;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import eu.aniketos.data.IAgreementTemplate;
import eu.aniketos.data.ICompositionPlan;
import eu.aniketos.data.IConsumerPolicy;
import eu.aniketos.scpm.data.impl.AgreementTemplate;
import eu.aniketos.scpm.data.impl.CompositionPlan;
import eu.aniketos.scpm.data.impl.ConsumerPolicy;
import eu.aniketos.scpm.impl.client.SCPMClient;
import eu.aniketos.scpm.userinterface.BPMNParser;
import eu.aniketos.scpm.userinterface.OrderSelectionAdapter;
import eu.aniketos.scpm.userinterface.VerifyAllSelectionAdapter;
//import eu.aniketos.scpm.userinterface.VerifyAllSelectionAdapter;
/**
* Client side of the Secure Composition Planner Module. This plugin has an user
* interface and demonstrates how to invoke and use Secure Composition Planner
* Module.
*
* @author Bo Zhou, David Lamb- Liverpool John Moores University May 2012
*
*/
public class ScpmUI extends ViewPart {
/**
* The ID of the view as specified by the extension.
*/
public static final String ID = "eu.aniketos.scpm.userinterface.views.ScpmUI";
public static final String templateFile = "/resources/Confidentiality_Agreement.xml";
public static final String policyFile = "/resources/Confidentiality_Policy.xml";
public static final String BPMNplan = "/resources/compositionPlan1.bpmn20.xml";
/**
* The shared instance.
*/
private static ScpmUI plugin;
/**
* Label shows "Available Composition Plans:".
*/
private Label labelAvailable;
/**
* Label shows "Secured Composition Plans:".
*/
private Label labelSecured;
/**
* Label shows "Unsecured Composition Plans:".
*/
private Label labelUnSecured;
/**
* Button used to browse local composition plan. When clicked, a file
* browser dialog will appear.
*/
private Button buttonBrowse;
/**
* Test button testing marketplace.
*/
private Button buttonRecomposition;
private Button buttonReconfiguration;
/**
* Button to trigger the verification process.
*/
private Button buttonSelect;
/**
* Button to clear all composition plans.
*/
private Button buttonClear;
/**
* Label shows "Order By:".
*/
private Label labelOrderBy;
/**
* Button to make order of all composition plans.
*/
private Button buttonOrder;
/**
* Button to go back to previous page.
*/
private Button buttonBack;
/**
* Composite holds all elements that relate to original composition plans.
*/
public static Composite compositeSelect;
/**
* Composite holds all elements that relate to verification and ordering of
* composition plans.
*/
public static Composite compositeOrder;
/**
* Composite holds all elements that relate to individual services.
*/
private Composite compositeServices;
/**
* "Aniketos Services in selected composition plan:".
*/
private Label labelServices;
/**
* Table holds original list of composition plans".
*/
public static Table compositionTable;
/**
* ID column for compositionTable. It shows the ID of composition plan.
*/
private TableColumn colID;
/**
* Name column for compositionTable. It shows the name of composition plan.
*/
private TableColumn colName;
/**
* AgreementTemplate column for compositionTable. It shows the content of
* agreement template.
*/
private TableColumn colAgreementTemplate;
/**
* ConsumerPolicy column for compositionTable. It shows the content of
* consumer policy.
*/
private TableColumn colConsumerPolicy;
/**
* Table holds list of composition plans that verified as secured".
*/
public static Table compositionTable_Secured;
/**
* ID column for secured table. It shows the ID of composition plan.
*/
private TableColumn colID_Secured;
/**
* Name column for secured table. It shows the name of composition plan.
*/
private TableColumn colName_Secured;
private TableColumn colResult_Secured;
public static TableColumn colValue_Secured;
/**
* Table holds list of composition plans that verified as unsecured".
*/
public static Table compositionTable_UnSecured;
/**
* ID column for unsecured table. It shows the ID of composition plan.
*/
private TableColumn colID_UnSecured;
/**
* Name column for unsecured table. It shows the name of composition plan.
*/
private TableColumn colName_UnSecured;
private TableColumn colReason_UnSecured;
/**
* Table holds list of services in selected composition plan".
*/
private Table serviceTable;
/**
* Name column for service table. It shows the ID of service.
*/
private TableColumn colID_Services;
/**
* A service that selected in serviceTable.
*/
private TableItem targetService;
/**
* Constant value represents column ID for all Table.
*/
public static final int COL_ID = 0;
/**
* Constant value represents column Name for all Table.
*/
public static final int COL_NAME = 1;
/**
* Constant value represents column Agreement Template for compositionTable.
*/
public static final int COL_AT = 2;
/**
* Constant value represents column Order for Secured Table.
*/
public static final int COL_RESULT = 2;
public static final int COL_VALUE = 3;
public static final int COL_REASON = 2;
/**
* Constant value represents column ConsumerPolicy for compositionTable.
*/
public static final int COL_CP = 3;
static final double iniValue = 0.5;
public static Slider sliderCredibility;
private Text valueCredibility;
private Slider sliderAvailability;
private Text valueAvailability;
public static Slider sliderValidness;
private Text valueValidness;
public static Slider sliderTrustworthiness;
private Text valueTrustworthiness;
public static Text textURL;
private Label labelURL;
private Button buttonURL;
/**
* Generator of Random valye.
*/
Random randomGenerator = new Random();
/**
* The constructor.
*/
public ScpmUI() {
plugin = this;
}
/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*
* @param parent
* The parent composite that holds the interface elements.
*/
public void createPartControl(final Composite parent) {
// set labels and buttons to open BPMN20.XML files
parent.setLayout(null);
compositeSelect = new Composite(parent, SWT.BORDER);
compositeSelect.setLayout(null);
compositeSelect.setBounds(1, 1, 250, 350);
labelAvailable = new Label(compositeSelect, 0);
labelAvailable.setText("Available Composition Plans:");
labelAvailable.setBounds(1, 1, 248, 20);
compositionTable = new Table(compositeSelect, SWT.CHECK | SWT.SINGLE
| SWT.FULL_SELECTION);
compositionTable.setHeaderVisible(true);
compositionTable.setLinesVisible(true);
compositionTable.setBounds(2, 23, 240, 200);
colID = new TableColumn(compositionTable, SWT.CENTER, COL_ID);
colID.setText("ID");
colID.pack();
colName = new TableColumn(compositionTable, SWT.CENTER, COL_NAME);
colName.setText("Location");
colName.pack();
colAgreementTemplate = new TableColumn(compositionTable, SWT.CENTER,
COL_AT);
colAgreementTemplate.setText("AgreeTemps");
colAgreementTemplate.pack();
colConsumerPolicy = new TableColumn(compositionTable, SWT.CENTER,
COL_CP);
colConsumerPolicy.setText("Policy");
colConsumerPolicy.pack();
buttonSelect = new Button(compositeSelect, SWT.PUSH);
buttonSelect.setText("Verify All");
buttonSelect.setBounds(10, 260, 80, 25);
// buttonSelect.setVisible(false);
buttonClear = new Button(compositeSelect, SWT.PUSH);
buttonClear.setText("Delete All");
buttonClear.setBounds(150, 228, 80, 25);
buttonBrowse = new Button(compositeSelect, SWT.CENTER);
buttonBrowse.setText("Add Local Plan");
buttonBrowse.setBounds(1, 228, 100, 25);
buttonRecomposition = new Button(compositeSelect, SWT.CENTER);
buttonRecomposition.setText("Recompose");
buttonRecomposition.setBounds(95, 260, 70, 25);
buttonReconfiguration = new Button(compositeSelect, SWT.CENTER);
buttonReconfiguration.setText("Reconfigure");
buttonReconfiguration.setBounds(170, 260, 70, 25);
labelURL = new Label (compositeSelect, 0);
labelURL.setText("SCPM service address:");
labelURL.setBounds(1, 290, 160, 15);
buttonURL = new Button(compositeSelect, SWT.CHECK);
buttonURL.setSelection(false);
buttonURL.setText("Edit");
buttonURL.setLocation(170,290);
buttonURL.pack();
textURL = new Text (compositeSelect, SWT.BORDER | SWT.MULTI);
textURL.setText("http://ec2-54-235-118-152.compute-1.amazonaws.com:9092/scpm?wsdl");
textURL.setBounds(1, 310, 240, 20);
textURL.setEnabled(false);
compositeOrder = new Composite(parent, SWT.BORDER);
compositeOrder.setLayout(null);
compositeOrder.setVisible(false);
compositeOrder.setBounds(1, 1, 250, 350);
labelSecured = new Label(compositeOrder, 0);
labelSecured.setText("Verified Composition Plans:");
labelSecured.setBounds(1, 1, 248, 20);
compositionTable_Secured = new Table(compositeOrder, SWT.SINGLE
| SWT.FULL_SELECTION);
compositionTable_Secured.setHeaderVisible(true);
compositionTable_Secured.setLinesVisible(true);
compositionTable_Secured.setBounds(2, 23, 240, 200);
colID_Secured = new TableColumn(compositionTable_Secured, SWT.CENTER,
COL_ID);
colID_Secured.setText("ID");
colID_Secured.pack();
colName_Secured = new TableColumn(compositionTable_Secured, SWT.CENTER,
COL_NAME);
colName_Secured.setText("Plans");
colName_Secured.setWidth(88);;
colResult_Secured = new TableColumn(compositionTable_Secured,
SWT.CENTER, COL_RESULT);
colResult_Secured.setText("Result");
colResult_Secured.setWidth(80);
colValue_Secured = new TableColumn(compositionTable_Secured,
SWT.CENTER, COL_VALUE);
colValue_Secured.setText("Value");
colValue_Secured.pack();
labelOrderBy = new Label(compositeOrder, 0);
labelOrderBy.setText("Order Criteria:");
labelOrderBy.setBounds(1, 228, 80, 20);
buttonOrder = new Button(compositeOrder, SWT.PUSH);
buttonOrder.setText("Order/Rank");
buttonOrder.setBounds(90, 225, 70, 25);
buttonBack = new Button(compositeOrder, SWT.PUSH);
buttonBack.setText("Back");
buttonBack.setBounds(170, 225, 70, 25);
// criteriaList = new Combo(compositeOrder, SWT.DROP_DOWN | SWT.BORDER |
// SWT.READ_ONLY);
// criteriaList.setBounds(1, 250, 100, 25);
// loadOrderCriteria();
sliderTrustworthiness = new Slider(compositeOrder, SWT.HORIZONTAL);
sliderTrustworthiness.setBounds(1, 255, 110, 20);
sliderTrustworthiness.setMaximum(104);
sliderTrustworthiness.setMinimum(0);
sliderTrustworthiness.setIncrement(1);
sliderTrustworthiness.setPageIncrement(5);
sliderTrustworthiness.setThumb(4);
valueTrustworthiness = new Text(compositeOrder, SWT.BORDER | SWT.MULTI);
valueTrustworthiness.setEditable(false);
valueTrustworthiness.setBounds(120, 255, 125, 20);
sliderTrustworthiness.setSelection(50);
valueTrustworthiness.setText("Trustworthiness: "
+ roundTwoDecimals(iniValue));
sliderCredibility = new Slider(compositeOrder, SWT.HORIZONTAL);
sliderCredibility.setBounds(1, 280, 110, 20);
sliderCredibility.setMaximum(104);
sliderCredibility.setMinimum(0);
sliderCredibility.setIncrement(1);
sliderCredibility.setPageIncrement(5);
sliderCredibility.setThumb(4);
valueCredibility = new Text(compositeOrder, SWT.BORDER | SWT.MULTI);
valueCredibility.setEditable(false);
valueCredibility.setBounds(120, 280, 125, 20);
sliderCredibility.setSelection(50);
valueCredibility.setText("Credibility: " + roundTwoDecimals(iniValue));
sliderValidness = new Slider(compositeOrder, SWT.HORIZONTAL);
sliderValidness.setBounds(1, 305, 110, 20);
sliderValidness.setMaximum(104);
sliderValidness.setMinimum(0);
sliderValidness.setIncrement(1);
sliderValidness.setPageIncrement(5);
sliderValidness.setThumb(4);
valueValidness = new Text(compositeOrder, SWT.BORDER | SWT.MULTI);
valueValidness.setEditable(false);
valueValidness.setBounds(120, 305, 125, 20);
sliderValidness.setSelection(50);
valueValidness.setText("Validness: " + roundTwoDecimals(iniValue));
sliderAvailability = new Slider(compositeOrder, SWT.HORIZONTAL);
sliderAvailability.setBounds(1, 390, 160, 40);
sliderAvailability.setMaximum(104);
sliderAvailability.setMinimum(0);
sliderAvailability.setIncrement(1);
sliderAvailability.setPageIncrement(5);
sliderAvailability.setThumb(4);
valueAvailability = new Text(compositeOrder, SWT.BORDER | SWT.MULTI);
valueAvailability.setEditable(false);
valueAvailability.setBounds(165, 390, 100, 40);
sliderAvailability.setSelection(50);
valueAvailability
.setText("VerifyValue:\n" + roundTwoDecimals(iniValue));
sliderAvailability.setVisible(false);
valueAvailability.setVisible(false);
// criteriaList.add("Trustworthiness");
// criteriaList.add("Breach Reporting");
labelUnSecured = new Label(compositeOrder, 0);
labelUnSecured.setText("UnSecured Composition Plans:");
labelUnSecured.setBounds(250, 1, 180, 20);
compositionTable_UnSecured = new Table(compositeOrder, SWT.SINGLE
| SWT.FULL_SELECTION);
compositionTable_UnSecured.setHeaderVisible(true);
compositionTable_UnSecured.setLinesVisible(true);
compositionTable_UnSecured.setBounds(250, 23, 240, 200);
compositionTable_UnSecured.setVisible(false);
colID_UnSecured = new TableColumn(compositionTable_UnSecured,
SWT.CENTER, COL_ID);
colID_UnSecured.setText("ID");
colID_UnSecured.pack();
colName_UnSecured = new TableColumn(compositionTable_UnSecured,
SWT.CENTER, COL_NAME);
colName_UnSecured.setText("Composition Plans");
colName_UnSecured.pack();
colReason_UnSecured = new TableColumn(compositionTable_UnSecured,
SWT.CENTER, COL_REASON);
colReason_UnSecured.setText("Explanation");
colReason_UnSecured.pack();
compositeServices = new Composite(parent, SWT.BORDER);
compositeServices.setLayout(new GridLayout(1, true));
compositeServices.setVisible(false);
labelServices = new Label(compositeServices, 0);
labelServices
.setText("Aniketos Services in selected composition plan:");
serviceTable = new Table(compositeServices, SWT.CHECK | SWT.SINGLE
| SWT.FULL_SELECTION);
serviceTable.setHeaderVisible(true);
serviceTable.setLinesVisible(true);
colID_Services = new TableColumn(serviceTable, SWT.CENTER, COL_ID);
colID_Services.setText("Service ID");
colID_Services.pack();
/**
* listener for browse button. Find a composition plan in the local
* system.
*/
buttonBrowse.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
// the duplication judgement here is based on the file location,
// it could be and should be changed to be based on composition
// ID later.
String fileBPMN = getFileName();
if (fileBPMN == null)
return;
String fileContent = fileOpen (fileBPMN);
String planID = BPMNParser.getProcessId(BPMNParser.getDocument(fileContent));
for (int itemNum = 0; itemNum < compositionTable.getItemCount(); itemNum++) {
String name = compositionTable.getItem(itemNum).getText(
COL_ID);
if (planID.equals(name)) {
MessageDialog.openError(parent.getShell(), "Error",
"NComposition plan with the same ID already exists! ");
return;
}
}
String planLocation = moveToWorkspace(fileBPMN);
int end = planLocation.lastIndexOf('\\');
if (end ==-1)
end = planLocation.lastIndexOf('/');
String planPath = planLocation.substring(0, end-1);
String atLocation = getATLocation(planPath);
String cpLocation = getCPLocation (planPath);
TableItem compositionPlan = new TableItem(compositionTable,
SWT.NULL);
compositionPlan.setText(new String[] {
planID + "", planLocation,
atLocation, cpLocation });
}
});
// temporary code to test SPDM
// buttonSPDM.addSelectionListener(new SelectionAdapter() {
// public void widgetSelected(SelectionEvent event) {
// ICompositionPlan p = new CompositionPlan ("23");
// p.setCompositionPlanID("3");
// saveCompositionPlan(p, "D:/eclipse/runtime-New_configuration/LocalProject/diagrams/Local/CompositionPlans");
// //planner = Activator.getDefault().getSCPM();
// //ICompositionPlan testS = planner.inputSPDMData();
//
// }
// });
// temporary code to test CSVM
// buttonCSVM.addSelectionListener(new SelectionAdapter() {
//
// public void widgetSelected(SelectionEvent event) {
//
// planner = Activator.getDefault().getSCPM();
//
// String exampleBPMN = "";
// String exampleActiviti = "";
//
// try {
// exampleBPMN = readFileAsString(this.getClass()
// .getClassLoader().getResource(csvmBPMN)
// .openStream());
// exampleActiviti = readFileAsString(this.getClass()
// .getClassLoader().getResource(csvmActiviti)
// .openStream());
// } catch (IOException e) {
//
// e.printStackTrace();
// }
//
// planner.testCSVM(exampleBPMN, exampleActiviti);
//
// }
// });
buttonRecomposition.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
String exampleBPMN = "";
String exampleCP = "";
String exampleAT = "";
try {
exampleBPMN = readFileAsString(this.getClass()
.getClassLoader().getResource(BPMNplan)
.openStream());
exampleCP = readFileAsString(this.getClass()
.getClassLoader().getResource(policyFile)
.openStream());
exampleAT = readFileAsString(this.getClass()
.getClassLoader().getResource(templateFile)
.openStream());
} catch (IOException e) {
e.printStackTrace();
}
ICompositionPlan backupBPMNdiagram = new CompositionPlan(
exampleBPMN);
IAgreementTemplate agreementTemplate = new AgreementTemplate(
"testingID");
IConsumerPolicy consumerPolicy = new ConsumerPolicy();
// TODO: at the moment use both ways to initialise agreement
// template and consumer policy
agreementTemplate.setXML(exampleAT);
String[] xmlContents = new String[1];
xmlContents[0] = exampleAT;
agreementTemplate.setXmlContents(xmlContents);
String[] xmlContents1 = new String[1];
consumerPolicy.setXML(exampleCP);
xmlContents1[0] = exampleCP;
consumerPolicy.setXmlContents(xmlContents1);
ICompositionPlan testS = SCPMClient.Recomposition(
backupBPMNdiagram, "infotast", agreementTemplate,
consumerPolicy, textURL.getText());
if (testS != null)
System.out.println(testS.getBPMNXML());
else
System.out.println("No new composition created");
}
});
buttonReconfiguration.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
String exampleBPMN = "";
String exampleAT = "";
String exampleCP = "";
try {
exampleBPMN = readFileAsString(this.getClass()
.getClassLoader().getResource(BPMNplan)
.openStream());
exampleCP = readFileAsString(this.getClass()
.getClassLoader().getResource(policyFile)
.openStream());
exampleAT = readFileAsString(this.getClass()
.getClassLoader().getResource(templateFile)
.openStream());
} catch (IOException e) {
e.printStackTrace();
}
ICompositionPlan backupBPMNdiagram = new CompositionPlan(
exampleBPMN);
IAgreementTemplate agreementTemplate = new AgreementTemplate(
"testingID");
IConsumerPolicy consumerPolicy = new ConsumerPolicy();
// TODO: at the moment use both ways to initialise agreement
// template and consumer policy
agreementTemplate.setXML(exampleAT);
String[] xmlContents = new String[1];
xmlContents[0] = exampleAT;
agreementTemplate.setXmlContents(xmlContents);
String[] xmlContents1 = new String[1];
consumerPolicy.setXML(exampleCP);
xmlContents1[0] = exampleCP;
consumerPolicy.setXmlContents(xmlContents1);
ICompositionPlan testS = SCPMClient.Reconfiguration(
backupBPMNdiagram, agreementTemplate, consumerPolicy, textURL.getText());
System.out.println(testS.getBPMNXML());
}
});
/**
* listener for 'clear all' button. Delete all composition plans in the
* table.
*/
buttonClear.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
boolean b = MessageDialog.openQuestion(parent.getShell(), "Warning", "Do you really want to delete all the composition plans in the table?");
if (b)
compositionTable.removeAll();
return;
}
});
/**
* listener for verification button. Verify composition plans one by
* one.
*/
buttonSelect.addSelectionListener(new VerifyAllSelectionAdapter(parent.getShell()));
buttonOrder.addSelectionListener(new OrderSelectionAdapter(parent.getShell()));
buttonURL.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent event) {
if (buttonURL.getSelection())
textURL.setEnabled(true);
else textURL.setEnabled(false);
}
}
);
/**
* go back to the available table
*/
buttonBack.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
compositeSelect.setVisible(true);
compositeOrder.setVisible(false);
}
});
/**
* listener for table. when a composition plan is selected, the service
* table shows the FlowElement (IDs) in the composition plan It uses the
* planner's parser and does not support Call Activity at this moment.
*/
compositionTable.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
if (compositionTable.getSelectionCount() == 0)
return;
String bpmnString = "";
TableItem[] selection = compositionTable.getSelection();
for (int i = 0; i < selection.length; i++)
// bpmnString = fileOpen(selection[i].getText(COL_NAME));
bpmnString = selection[i].getText(COL_NAME);
System.out.println("Selection={" + bpmnString + "}");
ICompositionPlan planTemp = new CompositionPlan(bpmnString);
List<String> serviceIDs = new Vector<String>();
serviceIDs = decompositeComposition(planTemp);
serviceTable.removeAll();
for (String id : serviceIDs) {
TableItem service = new TableItem(serviceTable, SWT.NULL);
service.setText(new String[] { id });
}
colID_Services.pack();
serviceTable.pack();
compositeServices.pack();
String fileName = "";
TableItem[] selection1 = compositionTable.getSelection();
for (int i = 0; i < selection1.length; i++)
fileName = selection1[i].getText(COL_NAME);
loadBPMN(fileName);
}
});
/**
* listener for table. when a composition plan is selected, the service
* table shows the FlowElement (IDs) in the composition plan It uses the
* planner's parser and does not support Call Activity at this moment.
*/
compositionTable_Secured.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
if (compositionTable_Secured.getSelectionCount() == 0)
return;
String bpmnString = "";
TableItem[] selection = compositionTable_Secured.getSelection();
for (int i = 0; i < selection.length; i++)
// bpmnString = fileOpen(selection[i].getText(COL_NAME));
bpmnString = selection[i].getText(COL_NAME);
System.out.println("Selection={" + bpmnString + "}");
ICompositionPlan planTemp = new CompositionPlan(bpmnString);
List<String> serviceIDs = new Vector<String>();
serviceIDs = decompositeComposition(planTemp);
serviceTable.removeAll();
for (String id : serviceIDs) {
TableItem service = new TableItem(serviceTable, SWT.NULL);
service.setText(new String[] { id });
}
colID_Services.pack();
serviceTable.pack();
compositeServices.pack();
String fileName = "";
TableItem[] selection1 = compositionTable_Secured
.getSelection();
for (int i = 0; i < selection1.length; i++)
fileName = selection1[i].getText(COL_NAME);
loadBPMN(fileName);
}
});
/**
* listener for table. when a composition plan is selected, the service
* table shows the FlowElement (IDs) in the composition plan It uses the
* planner's parser and does not support Call Activity at this moment.
*/
compositionTable_UnSecured.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
if (compositionTable_UnSecured.getSelectionCount() == 0)
return;
String bpmnString = "";
TableItem[] selection = compositionTable_UnSecured
.getSelection();
for (int i = 0; i < selection.length; i++)
// bpmnString = fileOpen(selection[i].getText(COL_NAME));
bpmnString = selection[i].getText(COL_NAME);
System.out.println("Selection={" + bpmnString + "}");
ICompositionPlan planTemp = new CompositionPlan(bpmnString);
List<String> serviceIDs = new Vector<String>();
serviceIDs = decompositeComposition(planTemp);
serviceTable.removeAll();
for (String id : serviceIDs) {
TableItem service = new TableItem(serviceTable, SWT.NULL);
service.setText(new String[] { id });
}
colID_Services.pack();
serviceTable.pack();
compositeServices.pack();
String fileName = "";
TableItem[] selection1 = compositionTable_UnSecured
.getSelection();
for (int i = 0; i < selection1.length; i++)
fileName = selection1[i].getText(COL_NAME);
loadBPMN(fileName);
}
});
// /**
// * listener for table. when right click a service in the table, a
// popup menu shows.
// */
// compositionTable_UnSecured.addMouseListener(new MouseAdapter() {
// public void mouseDown(final MouseEvent e)
// {
// if (e.button != 3) return;
// targetService = compositionTable_UnSecured.getItem(new
// Point(e.x,e.y));
// }
// });
//
// final Menu menuForUnsecuredTable = new
// Menu(compositionTable_UnSecured);
// compositionTable_UnSecured.setMenu(menuForUnsecuredTable);
//
// final MenuItem reasonItem = new MenuItem(menuForUnsecuredTable,
// SWT.NONE);
// reasonItem.setText("Show unsecured reason");
// /**
// * listener for popup menu "show unsecured reason".
// */
// reasonItem.addSelectionListener(new SelectionAdapter() {
// public void widgetSelected(final SelectionEvent e)
// {
// if (targetService==null) return;
//
// }
// });
/**
* listener for atomic service table. when right click a service in the
* table, a popup menu shows.
*/
serviceTable.addMouseListener(new MouseAdapter() {
public void mouseDown(final MouseEvent e) {
if (e.button != 3)
return;
targetService = serviceTable.getItem(new Point(e.x, e.y));
}
});
final Menu menu = new Menu(serviceTable);
serviceTable.setMenu(menu);
final MenuItem replaceItem = new MenuItem(menu, SWT.NONE);
replaceItem.setText("Replace service");
final MenuItem propertyItem = new MenuItem(menu, SWT.NONE);
propertyItem.setText("Show Properties");
replaceItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(final SelectionEvent e) {
if (targetService == null)
return;
}
});
sliderCredibility.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
int perspectiveValue = sliderCredibility.getSelection();
valueCredibility.setText("Credibility: "
+ roundTwoDecimals(perspectiveValue / 100.0));
}
});
sliderAvailability.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
int perspectiveValue = sliderAvailability.getSelection();
valueAvailability.setText("VerifyValue: "
+ roundTwoDecimals(perspectiveValue / 100.0));
}
});
sliderValidness.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
int perspectiveValue = sliderValidness.getSelection();
valueValidness.setText("Validness: "
+ roundTwoDecimals(perspectiveValue / 100.0));
}
});
sliderTrustworthiness.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
int perspectiveValue = sliderTrustworthiness.getSelection();
valueTrustworthiness.setText("Trustworthiness: "
+ roundTwoDecimals(perspectiveValue / 100.0));
}
});
}
public static double roundTwoDecimals(double d) {
DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setDecimalSeparator('.');
DecimalFormat twoDForm = new DecimalFormat("#.##", symbols);
return Double.valueOf(twoDForm.format(d));
}
/**
* Prompts the user for, and returns a file name on the local system. The
* file open dialogue box will be restricted to showing .xml and .bpmn20.xml
* files only
*
* @return Name of the file that has been selected by the user.
*/
private String getFileName() {
FileDialog dialog = new FileDialog(compositionTable.getShell(),
SWT.OPEN);
dialog.setText("Open");
String[] filterExt = { "*.bpmn20.xml; *.xml", };
dialog.setFilterExtensions(filterExt);
String fileName = dialog.open();
return fileName;
}
/**
* @see getFileName().
* @see loadBPMN() Move the user selected composition plan into workspace.
* The selected composition plan will be browsable from the package
* explore. It is used when ask the system to open a file automatically
* (as in loadBPMN()). The files are saved at /AniketosFiles/BPMNdiagrams
*
* @param fileName
* of the file that has been selected by the user.
*/
private String moveToWorkspace(String fileName) {
String planContent = fileOpen(fileName);
String planID = BPMNParser.getProcessId(BPMNParser.getDocument(planContent));
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
String savedLocation = null;
ICompositionPlan plan = new CompositionPlan (planContent);
plan.setCompositionPlanID(planID);
savedLocation = root.getLocation()+"\\LocalProject\\diagrams\\Local\\CompositionPlans";
savedLocation = saveToWorkspace(plan, savedLocation);
return savedLocation;
}
/**
* Save the received composition plan (from Service Composition Framework)
* into workspace. The received composition plan will be browsable from the
* package explore. It is used when ask the system to open a file
* automatically (as in loadBPMN()). The files are saved at
* /AniketosFiles/BPMNdiagrams. *
*
* @param compositionPlan
* Composition Plan that received from SCF.
* @return Location of the composition plan file in local system.
*
* @see saveCompositionPlan{}
* @see moveToWorkspace()
* @see loadBPMN
*/
private String saveToWorkspace(ICompositionPlan compositionPlan, String path) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
IFile file = null;
String tempFile = path.replace("\\", "/");
String filePath[] = tempFile.split("/");
int pathLength = filePath.length;
String savedLocation = null;
try {
IProject bpmnProject = root.getProject(filePath[pathLength-4]);
if (!bpmnProject.exists()) {
System.out.print("xxx project not exists xxx");
bpmnProject.create(null);
}
if (!bpmnProject.isOpen())
bpmnProject.open(null);
IFolder folder = bpmnProject.getFolder(filePath[pathLength-3]);
if (!folder.exists()) {
System.out.print("xxx Folder not exists xxx");
folder.create(true, true, null);
}
folder = folder.getFolder(filePath[pathLength-2]);
if (!folder.exists()) {
System.out.print("xxx Folder not exists xxx");
folder.create(true, true, null);
}
folder = folder.getFolder(filePath[pathLength-1]);
if (!folder.exists()) {
System.out.print("xxx Folder not exists xxx");
folder.create(true, true, null);
}
String fileName = compositionPlan.getCompositionPlanID()
+ ".bpmn20.xml";
file = folder.getFile(fileName);
if (file.exists())
file.delete(true, null);
InputStream source = new ByteArrayInputStream(compositionPlan
.getBPMNXML().getBytes());
file.create(source, false, null);
// System.out.println("Diagram full path:"+file.getFullPath().toOSString());
// System.out.println(root.getLocation());
savedLocation = root.getLocation()
+ file.getFullPath().toOSString();
savedLocation = savedLocation.replace('/', '\\');
} catch (Exception e1) {
// Auto-generated catch block
e1.printStackTrace();
}
return savedLocation;
}
private String getCPLocation(String path) {
int last = path.lastIndexOf("\\");
if (last ==-1)
last = path.lastIndexOf("/");
String filePath = path.substring(0, last+1);
filePath += "ConsumerPolicies";
filePath = filePath.replace('/', '\\');
return filePath;
}
private String getATLocation(String path) {
int last = path.lastIndexOf("\\");
if (last ==-1)
last = path.lastIndexOf("/");
String filePath = path.substring(0, last+1);
filePath += "AgreementTemplates";
filePath = filePath.replace('/', '\\');
return filePath;
}
/**
* Load the composition plan as Activiti diagram. It is used when user
* manually selects composition plans from the table. The method uses system
* API to load the *.bpmn20.xml file first. That will create a *.activiti
* file automatically. It then close the *.bpmn20.xml file and load the
* *.activiti file instead. During the process it also abstracts any
* security extensions that embedded in the composition plan by SCF. If
* there is any extensions found, it saves them in the activiti file as the
* system will not deal with security extensions by default.
*
* The files are loaded from /AniketosFiles/BPMNdiagrams in the workspace.
*
* @param fileName
* File name with full path to the bpmn file.
*
* @see saveToWorkspace()
* @see moveToWorkspace()
* @see getExtensions(); setExtensions()
*/
private void loadBPMN(String fileName) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
String fileActiviti = "";
String tempFile = fileName.replace("\\", "/");
String filePath[] = tempFile.split("/");
int idx = tempFile.lastIndexOf("/");
if (idx >= 0)
fileActiviti = tempFile.substring(idx + 1);
else return;
fileActiviti.toLowerCase();
idx = fileActiviti.lastIndexOf(".bpmn20.xml");
if (idx >= 0)
fileActiviti = fileActiviti.substring(0, idx);
fileActiviti = fileActiviti.concat(".activiti");
String bpmnEditorId = "org.activiti.designer.editor.bpmn";
String diagramEditorId = "org.activiti.designer.editor.multiPageEditor";
IFile fileBPMN = null;
IFile fileDiagram = null;
IFolder folder = null;
int pathLength = filePath.length;
try {
IProject bpmnProject = root.getProject(filePath[pathLength-5]);
if (!bpmnProject.exists()) {
System.out.print("xxx project not exists xxx");
bpmnProject.create(null);
}
if (!bpmnProject.isOpen())
bpmnProject.open(null);
folder = bpmnProject.getFolder(filePath[pathLength-4]);
if (!folder.exists()) {
System.out.print("xxx Folder not exists xxx");
folder.create(true, true, null);
}
folder = folder.getFolder(filePath[pathLength-3]);
if (!folder.exists()) {
System.out.print("xxx Folder not exists xxx");
folder.create(true, true, null);
}
folder = folder.getFolder(filePath[pathLength-2]);
if (!folder.exists()) {
System.out.print("xxx Folder not exists xxx");
folder.create(true, true, null);
}
fileBPMN = folder.getFile(filePath[pathLength-1]);
} catch (Exception e1) {
// Auto-generated catch block
e1.printStackTrace();
}
// Get the view
IWorkbenchWindow window = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
IEditorInput bpmnInput = new FileEditorInput(fileBPMN);
try {
IEditorPart bpmnEditor = page.openEditor(bpmnInput, bpmnEditorId);
page.closeEditor(bpmnEditor, true);
fileDiagram = folder.getFile(fileActiviti);
File bpmnFile = fileBPMN.getRawLocation().makeAbsolute().toFile();
DocumentBuilderFactory bpmnFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder bpmnBuilder = bpmnFactory.newDocumentBuilder();
Document bpmnDoc = bpmnBuilder.parse(bpmnFile);
bpmnDoc.getDocumentElement().normalize();
File activitiFile = fileDiagram.getRawLocation().makeAbsolute()
.toFile();
DocumentBuilderFactory activitiFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder activitiBuilder = activitiFactory
.newDocumentBuilder();
Document activitiDoc = activitiBuilder.parse(activitiFile);
activitiDoc.getDocumentElement().normalize();
NodeList allList = activitiDoc.getDocumentElement().getChildNodes();
List<org.w3c.dom.Element> bpmn2Element = new Vector<org.w3c.dom.Element>();
for (int index = 0; index < allList.getLength(); index++) {
Node bpmn2Node = allList.item(index);
if (bpmn2Node.getNodeType() == Node.ELEMENT_NODE) {
org.w3c.dom.Element eElement = (org.w3c.dom.Element) bpmn2Node;
if (eElement.getTagName().startsWith("bpmn2:")) {
bpmn2Element.add(eElement);
// System.out.println("bpmn2 ID : " + getAttValue("id",
// eElement));
}
}
}
NodeList serviceList = bpmnDoc.getElementsByTagName("serviceTask");
for (int index = 0; index < serviceList.getLength(); index++) {
org.w3c.dom.Element serviceElement = (org.w3c.dom.Element) serviceList
.item(index);
String serviceID = getAttValue("id", serviceElement);
List<String> serviceAttributes = new Vector<String>();
serviceAttributes = getExtensions(serviceElement);
setExtensions(serviceID, serviceAttributes, bpmn2Element);
}
for (int index = 0; index < bpmn2Element.size(); index++)
System.out.println(getAttValue("expression",
bpmn2Element.get(index)));
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(activitiDoc);
StreamResult result = new StreamResult(fileDiagram.getRawLocation()
.makeAbsolute().toFile());
transformer.transform(source, result);
IEditorInput diagramInput = new FileEditorInput(fileDiagram);
page.openEditor(diagramInput, diagramEditorId);
} catch (PartInitException e) {
throw new RuntimeException(e);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
return;
}
/**
* Opens and reads the file specified, returning the contents as a string
*
* @param name
* The name of the file
* @return the contents of the file in String format.
*/
public static String fileOpen(String name) {
StringBuffer buf = new StringBuffer();
try {
InputStream streamTemp = new FileInputStream(name);
int ch;
try {
while ((ch = streamTemp.read()) != -1)
buf.append((char) ch);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException fe) {
}
// System.out.println(buf.toString());
return buf.toString();
}
/**
* Obtains the plan name/location given its ID
*
* @param bpmnID
* A valid BPMN ID
* @return the BPMN name and location
*/
public static String getLocation(String bpmnID) {
String tempString = "";
for (int itemNum = 0; itemNum < compositionTable.getItemCount(); itemNum++) {
if (compositionTable.getItem(itemNum).getText(COL_ID)
.equals(bpmnID))
tempString = compositionTable.getItem(itemNum)
.getText(COL_NAME);
}
return tempString;
}
/**
* Save composition plan as local. The method is called by Service
* Composition Framework. The saved composition plan will appear in the
* composition plan table.
*
* @param compositionPlan
* A composition plan in XML format.
* @param agreementTemplates
* Agreement templates for all the atomic service in the
* composition plan.
* @param consumerPolicy
* The consumer policy.
*
* @see saveToWorkspace{}
*/
public void saveCompositionPlan(ICompositionPlan compositionPlan, String location) {
String cpID = compositionPlan.getCompositionPlanID();
for (int itemNum = 0; itemNum < compositionTable.getItemCount(); itemNum++) {
String id = compositionTable.getItem(itemNum).getText(COL_ID);
if (cpID.equals(id)) {
return;
}
}
TableItem compositionPlanTemp = new TableItem(compositionTable,
SWT.NULL);
String savedLocation = saveToWorkspace(compositionPlan, location);
String savedCPLocation = getCPLocation (location);
String savedATLocation = getATLocation (location);
compositionPlanTemp.setText(new String[] {
cpID, savedLocation, savedATLocation, savedCPLocation });
}
/**
* Clear the composition plan table. The method is called by Service
* Composition Framework.
*
*/
public void clearCompositionPlans() {
compositionTable.removeAll();
}
/**
* update the consumer policy in SCF to include the order criteira
*
*/
public IConsumerPolicy updateConsumerPolicy(IConsumerPolicy consumerPolicy) {
String orderCriteria = "\n<!--OrderCriteria";
double trustworthiness = roundTwoDecimals(sliderTrustworthiness
.getSelection() / 100.0);
orderCriteria = orderCriteria + " Trustworthiness " + trustworthiness;
double credibility = roundTwoDecimals(sliderCredibility.getSelection() / 100.0);
orderCriteria = orderCriteria + " Credibility " + credibility;
double validness = roundTwoDecimals(sliderValidness.getSelection() / 100.0);
orderCriteria = orderCriteria + " Validness " + validness;
orderCriteria += " -->";
// TODO: may consider use the getXML and setXML for order value only if
// it will no longer be used for real consumer content.
String policyXML = consumerPolicy.getXML();
policyXML += orderCriteria;
IConsumerPolicy updatePolicy = new ConsumerPolicy();
updatePolicy = consumerPolicy;
updatePolicy.setXML(policyXML);
return updatePolicy;
}
/**
* It is compulsory to implement this method when implementing
* WorkbenchPart. We'll use it to ask for our compare button to get the
* focus.
*/
public void setFocus() {
this.buttonSelect.setFocus();
}
/**
* Return the shared instance.
*
* @return The shared instance of the plugin.
*/
public static ScpmUI getUI() {
return plugin;
}
// /**
// * Read input file and transforms it into Base64 String format.
// * @param is Input stream that contains the file.
// * @return String in base64 format.
// */
// private static String readFileAsBase64String(InputStream is) throws
// java.io.IOException{
//
// ByteArrayOutputStream buffer = new ByteArrayOutputStream();
// int nRead;
// byte[] data = new byte[16384];
// while ((nRead = is.read(data, 0, data.length)) != -1) {
// buffer.write(data, 0, nRead);
// }
// buffer.flush();
// byte[] bytes = buffer.toByteArray();
// is.close();
// return Base64.encodeBase64String(bytes);
// }
/**
* Read input file and transforms it into String.
*
* @param is
* Input stream that contains the file.
* @return Output String.
*/
private static String readFileAsString(InputStream is)
throws java.io.IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[16384];
while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
is.close();
return buffer.toString();
}
// /**
// * Transform a String into Base64 String format.
// * @param s Input String.
// * @return Output String in base64 format.
// */
// private static String stringToBase64String(String s) {
//
// byte[] bytes;
//
// try
// {
// bytes = s.getBytes("US-ASCII");
// }
// catch (UnsupportedEncodingException ue)
// {
// bytes = s.getBytes();
// }
// return Base64.encodeBase64String(bytes);
//
// }
/*
* private Map<String, ISecurityProperty> getXMLValues(InputStream
* inputStream){ //String[] ret = new String[2]; Map<String,
* ISecurityProperty> ret = new HashMap<String, ISecurityProperty>(); try {
* DocumentBuilderFactory docBuilderFactory =
* DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder =
* docBuilderFactory.newDocumentBuilder(); Document doc =
* docBuilder.parse(inputStream);
*
* // normalize text representation doc.getDocumentElement().normalize();
*
* NodeList list = doc.getChildNodes(); list = list.item(0).getChildNodes();
* for(int i = 0; i<list.getLength(); i++){ Node node = list.item(i);
* if(node.getNodeType() == Node.ELEMENT_NODE){ ret.put(node.getNodeName(),
* new SecurityProperty(node.getNodeName(), node.getTextContent())); } }
*
* }catch (Exception e) { e.printStackTrace(); } return ret; }
*/
/**
* Decomposite the selected composition plan It uses the planner's parser.
*/
private List<String> decompositeComposition(ICompositionPlan compositionPlan) {
List<String> serviceIDs = new Vector<String>();
String bpmnString = compositionPlan.getBPMNXML();
serviceIDs = getServiceIDs(bpmnString);
return serviceIDs;
}
/**
* Decomposite the composition plan
*
* @param inputPlan
* the BPMN2 files location
* @return the serviceIDs in the composition plan. at this moment it only
* looks for serviceTask which will be the type of Aniketos Task
*/
private List<String> getServiceIDs(String inputPlan) {
List<String> serviceIDs = new Vector<String>();
try {
List<NodeList> translated = new Vector<NodeList>();
File fXmlFile = new File(inputPlan);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
System.out.println("Root element :"
+ doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("serviceTask");
System.out.println("-----------------------");
translated.add(nList);
List<org.w3c.dom.Element> tasks = new Vector<org.w3c.dom.Element>();
for (NodeList check : translated) {
for (int temp = 0; temp < check.getLength(); temp++) {
Node nNode = check.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
org.w3c.dom.Element eElement = (org.w3c.dom.Element) nNode;
tasks.add(eElement);
System.out.println("Service ID : "
+ getAttValue("id", eElement));
System.out.println("Service Name : "
+ getAttValue("name", eElement));
}
}
}
for (org.w3c.dom.Element service : tasks) {
serviceIDs.add(getAttValue("id", service));
}
} catch (Exception e) {
e.printStackTrace();
}
return serviceIDs;
}
/**
* Get the attribute value of an element by using XML parser. The input
* element must be a type of org.w3c.dom.Element
*
* @param sAtt
* The attribute name.
* @param eElement
* The element to be parsed.
* @return The value of the attribute if found.
*/
private static String getAttValue(String sAtt, org.w3c.dom.Element eElement) {
return eElement.getAttribute(sAtt);
}
/**
* @see loadBPMN When generates a *.activiti file from *.bpmn20.xml file,
* The Activiti designer only copes with the original tags/elements.
* Any security extensions that embedded in the composition plan by SCF
* have to be abstracted manually. This method looks for security
* extensions in the XML file.
*
* @param serviceElement
* The element to be parsed.
* @return Values of the extended attributes.
*/
private static List<String> getExtensions(org.w3c.dom.Element serviceElement) {
List<String> attValues = new Vector<String>();
NodeList attList = serviceElement
.getElementsByTagName("activiti:field");
for (int index = 0; index < attList.getLength(); index++) {
Node attNode = attList.item(index);
if (attNode.getNodeType() == Node.ELEMENT_NODE) {
org.w3c.dom.Element attElement = (org.w3c.dom.Element) attNode;
// have to guess the type of the value.
NodeList valueList = attElement
.getElementsByTagName("activiti:string");
if (valueList.getLength() == 0)
valueList = attElement
.getElementsByTagName("activiti:expression");
// assume there is only one child that contains the value
org.w3c.dom.Element valueElement = (org.w3c.dom.Element) valueList
.item(0);
attValues.add(valueElement.getTextContent());
}
}
return attValues;
}
/**
* @see loadBPMN
* @see getExtensions() When generates a *.activiti file from *.bpmn20.xml
* file, The Activiti designer only copes with the original
* tags/elements. Any security extensions that embedded in the
* composition plan by SCF have to be abstracted manually. This method
* saves security extensions into the activiti file.
*
* @param id
* The ID of element to be saved.
* @param attributes
* Value of the extended attributes.
* @param bpmn2Element
* The element to be parsed.
*/
private static void setExtensions(String id, List<String> attributes,
List<org.w3c.dom.Element> bpmn2Element) {
for (int index = 0; index < bpmn2Element.size(); index++) {
// System.out.println(getAttValue("id", bpmn2Element.get(index)));
if (getAttValue("id", bpmn2Element.get(index)).equals(id)) {
String fieldPosition = getAttValue("fieldExtensions",
bpmn2Element.get(index));
StringTokenizer str = new StringTokenizer(fieldPosition);
int attNumber = 0;
while (str.hasMoreElements()) {
String pString = (String) str.nextElement();
int pInt = Integer.parseInt(pString.substring(1));
// System.out.println(pInt);
bpmn2Element.get(pInt - 1).setAttribute("expression",
attributes.get(attNumber));
attNumber++;
}
}
}
}
}